package com.wyix.service;

import com.sun.org.slf4j.internal.Logger;
import com.sun.org.slf4j.internal.LoggerFactory;
import com.wyix.entity.Order;
import com.wyix.error.BaseBusinessException;
import com.wyix.error.InvalidOrderException;
import com.wyix.error.OrderNotFoundException;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.sql.SQLException;

/**
 * @author wangdx
 * @since 2025/8/1
 */
public class OrderService {
    private static final Logger log = LoggerFactory.getLogger(OrderService.class);

    // 1. 查询订单：不存在则抛出OrderNotFoundException（非受检异常，无需throws声明）
    public Order getOrderById(String orderId) {
        if ("TEST_001".equals(orderId)) { // 模拟数据库查询
            return new Order(orderId, "iPhone", 9999);
        }
        // 主动抛出异常（文档3.3节throw）
        throw new OrderNotFoundException(orderId);
    }

    // 2. 创建订单：参数校验失败抛出InvalidOrderException
    public void createOrder(Order order) {
        if (order.getAmount() <= 0) {
            throw new InvalidOrderException("订单金额必须大于0：" + order.getAmount());
        }
        if (order.getProductName() == null || order.getProductName().isEmpty()) {
            throw new InvalidOrderException("商品名称不能为空");
        }
        // 正常保存逻辑...
    }

    // 3. 从文件导入订单：使用try-with-resources自动释放资源（文档3.4节）
    public void importOrdersFromFile(String filePath) throws IOException { // 声明受检异常（文档3.3节throws）
        // try-with-resources：自动关闭BufferedReader（实现AutoCloseable接口）
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                String[] parts = line.split(",");
                Order order = new Order(parts[0], parts[1], Integer.parseInt(parts[2]));
                createOrder(order); // 可能抛出InvalidOrderException
            }
        }
        // catch块省略：让调用者处理IOException（受检异常必须声明或捕获）
    }

    // 4. 保存订单到数据库：异常链（包装底层异常，文档4.2节）
    public void saveOrderToDB(Order order) {
        try {
            // 模拟数据库操作抛出SQLException
            throw new SQLException("数据库连接超时：无法保存订单" + order.getId());
        } catch (SQLException e) {
            // 包装为业务异常，保留原始异常（e）形成异常链
            throw new BaseBusinessException("保存订单失败：" + order.getId(), "DB_ERROR", true, e) {
            };
        }
    }
}